#1.导入fastapi类和服务器uvicorn
from fastapi import FastAPI,Request,Response,status
import uvicorn
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles #可以托管一个文件作为一个运行的实例

#3.1使用静态模板文件
from fastapi.templating import Jinja2Templates



#5.导入子路由实例
from api.user import api_user
from api.book import api_book



#2. 核心的applacation实例
app = FastAPI()
app_son= FastAPI()
#3.2实例化模板文件
template = Jinja2Templates(directory='templates')


#一个服务器运行时,只有一个applacation,将子路由部分挂载
app.mount('/static', StaticFiles(directory='static'),name='static')
app.mount('/son',app_son)
app.include_router(api_user,prefix="/user",tags=['用户接口']) #包含子路由
app.include_router(api_book,prefix="/book",tags=['书籍接口'])

@app_son.get('/111')
def t_111():
    return 111;

#3. 写接口
@app.get('/{name}')
def hello(request:Request,name:str):
    '''
    前端发送请求时  get 协议://域名:端口号/path
    :return:
    '''
    # return FileResponse('templates/welcome.html') #返回的时静态文件,不会随着值的不同改变
    return template.TemplateResponse(request = request,
                                     name="welcome.html",
                                     context={'name':name,'data':{'msg':'欢迎你来使用系统!!!'}}
                                     )
@app.get('/hello')
def hello_name(name):

    return 'hello world '+name



'''
传参
1.get 参数无法放入请求体,url来传入,都是通过函数的参数接收
  a. ?name = xxx 放入qurey中
  b. 放入路径中 /user/{id}
2.post
  a.请求体为json(跟dict,必须用双引号,类型跟js一致(string array object))
    请求体是对象时,需要设定对象的类型
'''

'''
返回值
1.json 默认返回的就是转化的json
    json JavaScript下类似Object的数据传输的格式的字符串---->对象(反序列化) --->字符串(序列化)
    (number string object array boo) :  {"name":"Alice","age":19}  []
2.返回文件
   a.FileResponse 选定某个文件作为Response的内容
   b.static
3.页面
'''
@app.get("/favicon.ico") #http://127.0.0.1:8000/favicon.ico
def photo():
    #返回图片,实例化FileResponse
    return FileResponse('static/img/1.ico')


#4.将fastapi部署在服务器
if __name__ == '__main__':
    uvicorn.run(app='main:app') #http://127.0.0.1:8000/
